#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h> 
void gotoxy(int x, int y);
void imprimirEspaco(int n);
void centraliza( char mensagem[], int x1,  int x2, int y);
void corCaracteres(int n);
void corFundo(int n);
void corFundoECaractere( int corFund, int corLetr);
void corPadrao();
int obterCodigoDaCorCaracteres(int n);
int obterCodigoCorFundo(int n);
void janela( char mensagem[], int x1, int y1, int x2, int y2 );
void caixa(int x1, int y1, int x2, int y2);
int getch(void);

/**
* Muda o cursor para determinada posição xy
*/
void gotoxy(int x, int y)
{
    printf("\033[%d;%dH", y, x);
}

/**
* Função para imprimir espaços
* @param: (int) número de espaços
*/
void imprimirEspaco(int n)
{
    while(n > 0)
    {
        printf(" ");
        n--;
    }

}

/**
* Função que imprime mensagem centralizado em uma determinada coordenada
* @param: (char[]) mensagem
* @param: (int) coordenada x
* @param: (int) segunda coordenada y
* @param: (int) coordenada y
*/
void centraliza( char mensagem[], int x1,  int x2, int y)
{
    gotoxy(x1, y+1);
    int mediaCaixa = (x2 - x1) /2;
    int mediaMensagem = strlen(mensagem) / 2;
    int espacoBranco = mediaCaixa - mediaMensagem;
    imprimirEspaco(espacoBranco); printf("%s", mensagem);
    espacoBranco = (x2-x1) - strlen(mensagem) - espacoBranco;
    imprimirEspaco(espacoBranco);
}

/**
* Muda a cor dos carácteres
* @param: número da cor dos carácteres
*/
void corCaracteres(int n)
{
   printf("\033[%dm", obterCodigoDaCorCaracteres(n));
}

/**
* Muda cor do fundo
* @param: (int) número da cor de fundo
*/
void corFundo(int n)
{
   printf("\033[%dm", obterCodigoCorFundo(n));
}


/**
* Muda cor dos caracteres e do fundo
*/
void corFundoECaractere( int corFund, int corLetr)
{
    corFundo(corFund);
    corCaracteres(corLetr);
}

/**
* Muda a cor dos carácteres para o padrão
*/
void corPadrao()
{
    printf("\033[37m\033[40m");
}

/**
* Obtém código ansi da cor dos caractéres
*/
int obterCodigoDaCorCaracteres(int n)
{
   int codigo;
   switch(n)
   {
       case 1: codigo = 30; //preta
              break;
       case 2: codigo = 31; //vermelha
              break;
       case 3: codigo = 32; //verde
              break;
       case 4: codigo = 33; //laranja
              break;
       case 5: codigo = 34; //azul;
              break;
       case 6: codigo = 37; //branca
              break;      
   }
   return codigo;
}

/**
* Obtém código ansi da cor do fundo
*/
int obterCodigoCorFundo(int n)
{
   int codigo;
   switch(n)
   {
       case 1: codigo = 40; //preta
              break;
       case 2: codigo = 41; //vermelha
              break;
       case 3: codigo = 42; //verde
              break;
       case 4: codigo = 43; //laranja
              break;
       case 5: codigo = 44; //azul;
              break;
       case 6: codigo = 47; //branca
              break;
   }
   return codigo;
}


/**
*@deprecated Captura caracteres digitados
*@include <termios.h>
*@include <unistd.h> 
*@return int ch - número do caracter - codificação ASCII
**/
int getch(void)

{
  struct termios oldt, newt;
  int ch;

  tcgetattr( STDIN_FILENO, &oldt );
  newt=oldt;
  newt.c_lflag &= ~( ICANON | ECHO );
  tcsetattr( STDIN_FILENO, TCSANOW, &newt );
  ch = getchar();
  tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
  return ch;
}




/**
* Função que cria janela e imprimi a mensagem nela
* @param: (char[]) mensagem
* @param: (int) coordenada x
* @param: (int) coordenada y
* @param: (int) segunda coordenada x
* @param: (int) segunda coordenada y
*/
void janela( char mensagem[], int x1, int y1, int x2, int y2 )
{
    int i;
    caixa(x1, y1, x2, y2);
    corFundoECaractere(2, 6);
    centraliza(mensagem, x1, x2+2, y1);
    corFundo(5);
    for (i=y1+2; i <y2; i++)
    {
        gotoxy(x1+1, i); imprimirEspaco(x2-x1-1);
    }
    corPadrao();
}

/**
* Função que cria uma caixa
* @param: (int) coordenada x
* @param: (int) coordenada y
* @param: (int) segunda coordenada x
* @param: (int) segunda coordenada y
*/
void caixa(int x1, int y1, int x2, int y2)
{
    int i;
    //gotoxy(x1, y1); printf("+");
    gotoxy(x2, y2); printf("+");
    gotoxy(x1, y2); printf("+");
    //gotoxy(x2, y1); printf("+");
   
    for(i=x1+1; i<x2; i++)
    {
       // gotoxy(i, y1); printf("-");
        gotoxy(i, y2); printf("-");
    }

    for( i=y1+2; i<y2; i++)
    {
        gotoxy(x1, i); printf("|");
        gotoxy(x2, i); printf("|");
    }
}
